#pragma once


// Ejercicio 5 - b

#include "../excepciones/Excepciones.h"
#include "../tads/pilas/TPilaDinamica.h"

template<class TElem>
class TDosPilas2
{
public:
	TDosPilas2(void);
	~TDosPilas2(void);

	void apilar1(const TElem& elem);
	void apilar2(const TElem& elem);

	void desapilar1() throw (EAccesoIndebido);
	void desapilar2() throw (EAccesoIndebido);

	const TElem& cima1() const throw (EAccesoIndebido);
	const TElem& cima2() const throw (EAccesoIndebido);

private:
	TPilaDinamica<TElem>* _pila1;
	TPilaDinamica<TElem>* _pila2;

};

	template<class TElem>
	TDosPilas2<TElem>::TDosPilas2()
	{
		_pila1 = new TPilaDinamica<TElem>();
		_pila2 = new TPilaDinamica<TElem>();
	}


	template<class TElem>
	TDosPilas2<TElem>::~TDosPilas2(void)
	{
		delete _pila1;
		delete _pila2;
	}


	template<class TElem>
	void TDosPilas2<TElem>::apilar1(const TElem& elem)
	{
		_pila1->apilar(elem);
	}


	template<class TElem>
	void TDosPilas2<TElem>::apilar2(const TElem& elem)
	{
		_pila2->apilar(elem);
	}


	template<class TElem>
	void TDosPilas2<TElem>::desapilar1() throw (EAccesoIndebido)
	{
		try
		{
			_pila1->desapilar();
		}
		catch(EAccesoIndebido e);
		{
			throw e;
		}
	}


	template<class TElem>
	void TDosPilas2<TElem>::desapilar2() throw (EAccesoIndebido)
	{
		try
		{
			_pila2->desapilar();
		}
		catch(EAccesoIndebido e);
		{
			throw e;
		}
	}


	template<class TElem>
	const TElem& TDosPilas2<TElem>::cima1() const throw (EAccesoIndebido)
	{
		try
		{
			return _pila1->cima();
		}
		catch(EAccesoIndebido e);
		{
			throw e;
		}
	}


	template<class TElem>
	const TElem& TDosPilas2<TElem>::cima2() const throw (EAccesoIndebido)
	{
		try
		{
			return _pila2->cima();
		}
		catch(EAccesoIndebido e);
		{
			throw e;
		}
	}

